// import router from './router'
// import store from './store'
// import { Message } from 'element-ui'
// import NProgress from 'nprogress' // 进度条组件
// import 'nprogress/nprogress.css' // 进度条样式文件 
// import { getToken } from '@/utils/auth' // 用来从local得到token
// import getPageTitle from '@/utils/get-page-title' // 用来得到页面标题

// // 配置隐藏右侧旋转的进度提示
// NProgress.configure({ showSpinner: false }) 

// // 白名单列表 ==> 保存没有token才可以访问的路由
// const whiteList = ['/login'] 

// // 全局前置守卫 ==> 启动了路由跳转但还没有到达目标路由前调用
// router.beforeEach(async(to, from, next) => {
//   // 显示进度条
//   NProgress.start()

//   // 动态设置当前路由页面对应的页面标题
//   document.title = getPageTitle(to.meta.title)

//   // 读取local中token数据, 如果有值, 就代表有token
//   const hasToken = getToken()   
//   /* 
//   变量取名
//   1. 根据数据的意义来取名: const token = getToken()
//   2. 根据数据的用途/使用来取名: const hasToken = getToken()
//   */
//  // 有token: 前面登陆过 / 刚才前面请求登陆成功得到了token / 已经登陆了
//   if (hasToken) {
//     // 如果想跳转到登陆页面
//     if (to.path === '/login') {
//       // 强制跳转去后台管理的主页面根路径(也就是首页)
//       next({ path: '/' })
//       // 当次路由跳转中断结束, 结束进度度提示
//       NProgress.done()
//     } else { // 要跳转的是需要已登陆的页面
//       // 读取vuex中保存的登陆用户名(可能没有)
//       // 有用户名就是意味着有用户信息 ==> 说明已经登陆了
//       const hasGetUserInfo = store.getters.name

//       if (hasGetUserInfo) {
//         // 当前已登陆, 且要去也是要求得登陆的页面, 直接放行过去
//         next()  
//       } else { // 还没有登陆, 但目标路由是登陆得登陆的
//         try {

//           /* 
//           当前有token, 但还没有用户信息就会执行
//             1. 刷新页面(存在token)
//             2. 请求登陆成功后(也有了token了)
//           */
          
//           // 分发请求获取用户信息的异步action, 内部会动态注册异步权限路由
//           await store.dispatch('user/getInfo')
//           // 到了下面说明获取用户信息成功了, 且已经存储(vuex中)了用户信息
//           /* 
//           描述: 在权限路由上刷新/登陆成功后跳转到权限路由, 页面是空白的
//         ​	 原因: 在请求获取用户信息(包含路由权限)后, 自动动态添加了权限路由
//         ​    		 但由于这个操作发生在一次路由跳转的过程中, 这次的路由跳转是看不到新添加的路由
//         ​     		只有再次跳转一下, 才能看到最新添加的异步路由
//         ​	 解决:
//         ​			// next() // 放行, 没有重新跳转, 看不到最新添加的动态路由
//         ​     	// next(to.path) // 重新跳转到目标路由, 但丢失了参数(如果有的话)
//         ​     	next({...to}) // 重新跳转到目标路由, 且参数不会丢失

//             动态注册的路由, 只有在它后面开始的路由跳转才能看到
//             当次的路由跳转是发生在动态注册路由之前
//                ==> next()  如果直接放行匹配不到新的异步的路由
//                ==> 需要重新跳转去目标路由
//                     next(to.path): 
//                         能看到添加的路由 ==> 显示目标路由界面
//                         问题: 丢失参数数据
//                     next({...to}) 
//                         能看到添加的路由, 且保留的参数数据
//           */
//           // next()  // 问题: 刷新页面空白
//           // next(to.path) // 问题: 不能携带原有的参数数据
//           next({...to})  // 强制重新跳转到目标路由

//           NProgress.done() // 当次跳转中断结束, 结束进度提示

//         } catch (error) { // 请求获取用户信息失败了

//           // 分发重置token的action
//           store.dispatch('user/resetToken')
//           // 显示错误提示
//           Message.error(error || 'Has Error')
//           // 强制跳转到登陆页面去, 让其重新去登陆
//           next(`/login?redirect=${to.path}`)
//           // 结束进度提示
//           NProgress.done()
//         }
//       }
//     }
//   } else { // 没有token: 前面没登陆过, 当前也有登陆
//     // 如果目标路径在白名单中, 直接放行
//     // 放行的是没有token才能跳转过去的
//     if (whiteList.indexOf(to.path) !== -1) {
//       next()  // 放行后==> 到达目标路由 ==> 执行全局后置守卫
//     } else { // 当前要跳转的路由是必须要有token的, 但当前没有
//       // 强制跳转到登陆页面去, 
//       // 并携带原本要去的目标路由路径(用于登陆成功后能自动跳转到目标路由)
//       next(`/login?redirect=${to.path}`)
//       // 结束进度提示  
//       // why? 重置跳转会导致当前这次跳转不会进入后置守卫, 相当于当次跳转到结束了
//       NProgress.done()
//     }
//   }
// })

// // 全局后置守卫 ==> 路由跳转完成后
// router.afterEach(() => {
//   // 结束进度提示
//   NProgress.done()
// })
